import tkinter
import tkinter.filedialog
import zipfile
import os
import tkinter.simpledialog
import tkinter.messagebox

class Compress :
    def __init__(self):
        self.list1=[]
        self.root = tkinter.Tk()
        self.window()
        self.btn()


        self.root.mainloop()

    def window(self):
        self.root.minsize(550, 500)
        self.btn1 = tkinter.Button(self.root, text='文件类型')
        self.btn1.place(x=50, y=50,width=100,height=60)
        self.btn2 = tkinter.Button(self.root, text='压缩文件')
        self.btn2.place(x=220, y=50,width=100,height=60)
        self.btn3 = tkinter.Button(self.root, text='解压文件')
        self.btn3.place(x=390, y=50,width=100,height=60)
        self.label = tkinter.Label(self.root, text='请选择文件', bg='white', anchor='nw', justify='left',font=('微软雅黑',13))
        self.label.place(x=50, y=120, width=440, height=370)

    def Un_zip(self,e):
        # 解压文件
        jieyalujing = tkinter.filedialog.askopenfilenames(title='选择解压文件', filetypes=[('zip文件', '*.zip')])
        if len(jieyalujing) > 0:
            dirpath = tkinter.filedialog.askdirectory(title='选择解压路径')
            bol = bool(dirpath)
            if bol == True:
                zp = zipfile.ZipFile(jieyalujing[0], 'r', zipfile.ZIP_DEFLATED)
                zp.extractall(dirpath)
                tkinter.messagebox.showinfo(title='结果', message='文件解压成功，路径为：' + dirpath)
                zp.close()
            else:
                tkinter.messagebox.showinfo(title='提示', message='您提前退出解压失败')

    # 定义选择文件的按钮
    def xuanze(self,e):

        t = tkinter.Toplevel()
        t.minsize(310, 300)
        t.title('请选择压缩的文件类型')
        btn10 = tkinter.Button(t, text='文件', command=self.file)
        btn10.place(x=50, y=100, width=80, height=60)
        btn20 = tkinter.Button(t, text='文件夹', command=self.dir)
        btn20.place(x=140, y=100, width=80, height=60)


        # 循环窗口
        t.mainloop()
    def dir(self):
        # 弹出选择文件夹的窗口 并将选择的文件夹路径显示到label上
        self.dir_path = tkinter.filedialog.askdirectory(title='请选择要压缩的文件夹')
        if len(self.dir_path)>0:
            # os.listdit获取文件夹中的文件
            self.list1 += list(os.listdir(self.dir_path))
            self.label['text'] = '\n'.join(self.list1)
        else:
            self.list1.clear()
            self.label['text'] =('请选择文件')
    def file(self):
        # 弹出选择文件的窗口 并将选择的文件路径显示到label上
        file_path = tkinter.filedialog.askopenfilenames(title='请选择要压缩的文件', initialdir='C:\ ')
        if len(file_path) > 0:
            self.list1 += list(file_path)
            # print(list1)
            self.label['text'] = '\n'.join(self.list1)
        else:
            self.list1.clear()
            self.label['text'] =('请选择文件')
    def yasuo(self,e):
        if len(self.list1)>0:
            # 获取存放压缩文件的路径
            ysfile = tkinter.filedialog.asksaveasfilename(title='文件另存为', filetypes=(('zip文件', '*.zip'),))
            if len(ysfile)>0:
                #创建压缩文件
                zp=zipfile.ZipFile(ysfile+'.zip','w',zipfile.ZIP_DEFLATED)
                #取出要压缩的文件

                for path1 in self.list1:
                    if os.path.isabs(path1):
                        # 放入压缩文件
                        zp.write(path1, os.path.basename(path1))
                    else:
                        zp.write(self.dir_path + '/' + path1, os.path.basename(path1))
                        # print(os.path.dirname(self.dir_path)) + path1
                zp.close()
                tkinter.messagebox.showinfo(title='结果', message='文件压缩成功，路径为：' + ysfile)

            else:
                self.list1.clear()
                self.label['text'] = ('请选择文件')
        else:
            tkinter.messagebox.showerror('提示','请选择解压的文件')

    def btn(self):
        self.btn3.bind('<ButtonRelease-1>', self.Un_zip)
        self.btn2.bind('<ButtonRelease-1>',self.yasuo)
        self.btn1.bind('<ButtonRelease-1>',self.xuanze)
ys=Compress()